package com.yitao.client.utils;

import java.math.BigDecimal;

/**
 * 提供单位转换方法
 * Created by skp on 2016/4/25.
 */
public class NumberUtil {

    /**
     * 元转化为分
     *
     * @param price
     * @return
     */
    public static Long yuanToCent(Double price) {

        if (price == null) return 0l;

        String priceStringValue = price.toString();

        return yuanToCent(priceStringValue);
    }

    /**
     * 元转化为分
     *
     * @param price
     * @return
     */
    public static Long yuanToCent(String price) {

        if (price == null) return 0l;

        BigDecimal decimal = new BigDecimal(price);

        BigDecimal hDecimal = new BigDecimal(100);

        return decimal.multiply(hDecimal).longValue();
    }

    /**
     * 分转化为元
     *
     * @param price
     * @return
     */
    public static String centToYuan(Long price) {

        if (price == null) return "0";

        BigDecimal decimal = new BigDecimal(price).divide(new BigDecimal(100));

        return decimal.toString();
    }
    /**
     * 分转化为元
     *
     * @param price
     * @return
     */
    public static Double centToYuanForDouble(Long price) {

        if (price == null) return 0.00;

        BigDecimal decimal = new BigDecimal(price).divide(new BigDecimal(100));

        return decimal.doubleValue();
    }
    /**
     *   提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
     *   定精度，以后的数字四舍五入。
     *   @param   v1   被除数
     *   @param   v2   除数
     *   @param   scale   表示表示需要精确到小数点以后几位。
     *   @return   两个参数的商
     */
    public static double div(double v1,double v2,int scale){
        if(scale<0 || v2==0 ){
            throw   new   IllegalArgumentException("精确除法运算出错");
        }
        BigDecimal b1   =   new   BigDecimal(Double.toString(v1));
        BigDecimal   b2   =   new   BigDecimal(Double.toString(v2));
        return   b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     *   提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
     *   定精度，以后的数字四舍五入。
     *   @param   v1   被除数
     *   @param   v2   除数
     *   @param   scale   表示表示需要精确到小数点以后几位。
     *   @return   两个参数的商
     */
    public static double div(long v1,long v2,int scale){
        if(scale<0 || v2==0){
            throw   new   IllegalArgumentException("精确除法运算出错");
        }
        BigDecimal b1   =   new   BigDecimal(Long.toString(v1));
        BigDecimal   b2   =   new   BigDecimal(Long.toString(v2));
        return   b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     *   提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
     *   定精度，以后的数字只舍不入。
     *   @param   v1   被除数
     *   @param   v2   除数
     *   @param   scale   表示表示需要精确到小数点以后几位。
     *   @return   两个参数的商
     */
    public static double divDown(long v1,long v2,int scale){
        if(scale<0 || v2==0){
            throw   new   IllegalArgumentException("精确除法运算出错");
        }
        BigDecimal b1   =   new   BigDecimal(Long.toString(v1));
        BigDecimal   b2   =   new   BigDecimal(Long.toString(v2));
        return   b1.divide(b2, scale, BigDecimal.ROUND_DOWN).doubleValue();
    }
    /**
     *   提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
     *   定精度，以后的数字只入不舍。
     *   @param   v1   被除数
     *   @param   v2   除数
     *   @param   scale   表示表示需要精确到小数点以后几位。
     *   @return   两个参数的商
     */
    public static double divUP(long v1,long v2,int scale){
        if(scale<0 || v2==0){
            throw   new   IllegalArgumentException("精确除法运算出错");
        }
        BigDecimal b1   =   new   BigDecimal(Long.toString(v1));
        BigDecimal   b2   =   new   BigDecimal(Long.toString(v2));
        return   b1.divide(b2, scale, BigDecimal.ROUND_UP).doubleValue();
    }

    /**
     *   提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
     *   定精度，以后的数字四舍五入。
     *   @param   v1   被除数
     *   @param   v2   除数
     *   @param   scale   表示表示需要精确到小数点以后几位。
     *   @return   两个参数的商
     */
    public static String divforstr(long v1,long v2,int scale){
        if(scale<0 || v2==0 ){
            throw   new   IllegalArgumentException("精确除法运算出错");
        }
        BigDecimal b1   =   new   BigDecimal(Long.toString(v1));
        BigDecimal   b2   =   new   BigDecimal(Long.toString(v2));
        return   b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).toString();
    }


    public static void main(String[] args) {
        System.out.println(divDown(1,6002,4)*6000);
    }
}
